<!--
* @author luguoxiang
* @date 2021-09-07
* 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
-->
<template>
  <slot :loading="loading" :options="options" :props="bindProps">
    <component :is="props.component || 't-tree-select'" v-loading="loading" :data="options" v-bind="bindProps" />
  </slot>
</template>

<script lang="ts" setup>
import { computed, Component as ComponentDef, useAttrs } from 'vue';
import { LgBizTreeProps } from '../types';
import { FilterTypeEnum, useBizTree } from '@/soar';

interface Props extends LgBizTreeProps {
  /**
   * 数据配置
   */
  data: Function | string | any[];
  /**
   * 查询字段配置，默认第一个作为value,第二个作为label
   */
  fields?: string | string[];
  /**
   * 默认排序字段（优先级低于列配置）
   */
  orderBys?: string | string[];
  /**
   * 过滤条件
   */
  filters?: string | string[];
  /**
   * 值格式或字段，例：field 或 ${field1}-${field2}
   * 非必填
   */
  valueField?: string;
  /**
   * label格式，例：field 或 ${field1}（${field2}）
   * 非必填
   */
  labelField?: string;
  /**
   * 父id字段，格式，例：field 或 ${field1}（${field2}）
   */
  pidField?: string;
  /**
   * 分页大小
   */
  pageSize?: number;
  /**
   * 数据处理器
   */
  handler?: Function;
  /**
   * 前面的选项
   */
  prepend?: Function | Object[] | Object;
  /**
   * 后面的选项
   */
  append?: Function | Object[] | Object;
  /**
   * 搜索字段或true，为字符串时远程搜索具体字段，为true时本地筛选label
   */
  search?: string | boolean;
  /**
   * 使用的组件(可以是组件引入对象或字符串（全局引入的）)
   */
  component?: ComponentDef | string;
}
const props = defineProps<Props>();
const attrs = useAttrs();

const { loading, options, reload } = useBizTree(props);

// 属性处理
const bindProps = computed(() => {
  const { search } = props;
  if (search === true) {
    return {
      filterable: true,
      ...attrs,
    };
  }
  if (typeof search === 'string') {
    return {
      filterable: true,
      onSearch(e) {
        reload({ [`${props.search}-${FilterTypeEnum.LIKE}`]: e });
      },
      ...attrs,
    };
  }
  return attrs;
});

defineExpose({
  reload,
});
</script>
<script lang="ts">
export default {
  name: 'LgBizTree',
};
</script>
